/**
 * 单例。一个全局用户中心
 * 可以获得用户信息，用户是否登陆还是登出
 * 登陆需要在缓存保存token，登出则需要清除所有有关缓存
 */
import { singleton, container } from 'src/common/services/di';
import { InterfaceUserApiService, User, UserInfo, UserToken } from 'src/types/account';
import { BehaviorSubject } from 'rxjs';
import { YMEventService } from 'src/common/services/event';

@singleton()
export class UserApiService implements InterfaceUserApiService {
  private _user$ = new BehaviorSubject<User>(null);
  private _user: User = null;
  private _auth$ = new BehaviorSubject<any>(undefined);

  constructor(
    private ymEventService: YMEventService,
  ){
    this.getProfile();
  };

  private getProfile(): void {
    //后台发起请求获取用户信息来着,后台从cookie中获取账户相关信息，如果没有登陆过的用户
    //就到catch中去
  };

  update(user: UserInfo): void {
    let token = this.getLocalToken();
    //后面新获取的user and token 将前面的thie._user中的值覆盖
    const newUser = Object.assign({}, this._user, user, token);
    this._user = newUser;
    this._user$.next(Object.assign({}, newUser));
    this._auth$.next(true);
  };

  private getLocalToken(): any {
    let local = null;
    try {
      //获取本地浏览器缓存
    }catch(error){}
    return local;
  };

  updateProfile(): void {
    this.getProfile();
  };

  setToken(token: UserToken, expire_at: string): void {
    const endTime = new Date(expire_at).getTime();

    //然后将token and exprie_at一起存入缓存中
  };

  //这个方法后期加一个限流
  logout(): void {
    //第一步告诉后台用户登出，然后开始清除用户信息还有缓存信息，同时告诉全局时间中心用户登出
    this._auth$.next(false);
    this._user = null;
    this._user$.next(0);
    this.ymEventService.dispatch({ type: "ACCOUNT.LOGINOUT", message: '' });
  };

  get user() {
    return this._user;
  };

  get user$(){
    //将用户信息作为可监听对象对外暴露
    return this._user$.asObservable();
  }

  get auth$(){
    //获取授权信息。主要用于用户在进入一些需要登陆授权的页面，用这个作为判断值
    return this._auth$;
  }
}

export const ymUserServiceFactory = () => {
  return container.resolve(UserApiService);
}
